/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.reporte.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
import net.sf.jasperreports.engine.export.JRCsvExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRTextExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import org.reporte.accion.DatosReporteManejador;
import org.reporte.control.ProcesaDatosReporte;
import org.reporte.modelo.DatoReporte;
import org.reporte.utils.JsfAyuda;

/**
 *
 * @author 43579648
 */
public class GeneraReporte extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //Indicador que la salida sera un binario
        ServletOutputStream out = null;
        Connection conexion = null;
        DatosReporteManejador controlDatos = null;
        ProcesaDatosReporte procesaDatos = null;
        DatoReporte datoReporte =null;
        JasperReport reporteJasper = null;
        JasperPrint jasperPrint = null;
        try {


            Long identificadorGenerador = new Long(request.getParameter("idReporteGenera"));
            controlDatos = new DatosReporteManejador();
            procesaDatos = new ProcesaDatosReporte(request.getLocale());
            try {
                //Obteniendo datos
                datoReporte = controlDatos.obtenerDatoReportePorIdentificadorGenerador(identificadorGenerador);
                if (datoReporte == null) {//No hay informacion que generar
                    System.out.println(JsfAyuda.getPropertyValue("reporteNoDatosGenera",request.getLocale()).replace("{0}", String.valueOf(identificadorGenerador)));
                    throw new ServletException(JsfAyuda.getPropertyValue("reporteNoDatosGenera",request.getLocale()).replace("{0}", String.valueOf(identificadorGenerador)));
                }

                //Procesando datos
                procesaDatos.cargaDatosParametros(datoReporte);
                //Evaluando si el reporte se encuetra activo
                if(!procesaDatos.isReporteActivo())
                    throw new ServletException(JsfAyuda.getPropertyValue("reporteErrorNoActivo",request.getLocale()));

                //Obteniendo y convirtiendo reporte desde la base de datos
                String nombreReporte = procesaDatos.obtenerReporteNombre();
                //Verificando el tipo de fichero reporte almacenado
                if (nombreReporte.contains("jasper")) {
                    reporteJasper = (JasperReport) JRLoader.loadObject(procesaDatos.obtenerReporteBinario());   //Cargando el reporte
                } else if (nombreReporte.contains("jrxml")) {
                    reporteJasper = JasperCompileManager.compileReport(procesaDatos.obtenerReporteBinario()); //Compilando y cargando el reporte
                } else {
                    System.out.println("El fichero almacenado en la base de datos no es un reporte");
                    throw new ServletException(JsfAyuda.getPropertyValue("reporteFicheroIncorrecto",request.getLocale())); //Interrupcion del proceso
                }

                //Evaluando si el reporte tiene conexion con la BD
                if(procesaDatos.isReporteConexionBaseDatos())
                    conexion = procesaDatos.obtenerConexionBaseDatos();
                //Generando los parametros que se pasaran al reporte
                Map parametros = procesaDatos.obtenerParametrosDinamicosReporte();
                

                
                
                if(procesaDatos.isReporteDataSourceXML()){
                    JRXmlDataSource jrxmlds = new JRXmlDataSource(procesaDatos.obtenerDataSourceReporteDetalleAsXML(),
                                                                  procesaDatos.obtenerDataSourceReporteEstructuraSeleccionXML());
                    jasperPrint = JasperFillManager.fillReport(reporteJasper, parametros, jrxmlds);
                }
                else{
                    jasperPrint = JasperFillManager.fillReport(reporteJasper, parametros, conexion);
                }

                JRExporter exporter = null;

                //Obteniendo el tipo de reporte a generar
                String tipoReporte = procesaDatos.obtenerReporteTipoGenerar();
                //Cargando el tipo de reporte a generar
                if (tipoReporte.equalsIgnoreCase("txt")) {
                    response.setContentType("text/plain");
                    exporter = new JRTextExporter();
                } else if (tipoReporte.equalsIgnoreCase("xls")) {
                    response.setContentType("application/vnd.ms-excel");
                    exporter = new JRXlsExporter();
                } else if (tipoReporte.equalsIgnoreCase("pdf")) {
                    response.setContentType("application/pdf");
                    exporter = new JRPdfExporter();
                } else if (tipoReporte.equalsIgnoreCase("doc")) {
                    response.setContentType("application/msword");
                    exporter = new JRRtfExporter();
                } else if (tipoReporte.equalsIgnoreCase("xlsx")) {
                    response.setContentType("application/vnd.ms-excel");
                    exporter = new JRXlsxExporter();
                } else if (tipoReporte.equalsIgnoreCase("docx")) {
                    response.setContentType("application/msword");
                    exporter = new JRDocxExporter();
                } else if (tipoReporte.equalsIgnoreCase("csv")) {
                    response.setContentType("application/csv");
                    exporter = new JRCsvExporter();
                } else {
                    /*response.setContentType(procesaDatos.obtenerDatoReporteDesdeParametro(
                            JsfAyuda.getPropertyValueFromConfigurationFile(
                            JsfAyuda.getPropertyValueFromConfigurationFile("tipoContenido")
                            )
                            ).getValor());
                    exporter = (JRExporter) Class.forName(procesaDatos.obtenerDatoReporteDesdeParametro(
                            JsfAyuda.getPropertyValueFromConfigurationFile(
                            JsfAyuda.getPropertyValueFromConfigurationFile("importarClassJrexporter")
                            )
                            ).getValor()).newInstance();*/
                    throw new Exception(JsfAyuda.getPropertyValue("reporteFicheroNoSoportadoContenidoGeneracion",request.getLocale()));
                }

                //Lanzamiento del reporte
                out = response.getOutputStream();
                response.setHeader(JsfAyuda.getPropertyValue("paginaTituloSegundoNombre", request.getLocale()), procesaDatos.obtenerReporteNombre());
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
                exporter.exportReport();
                System.out.println("Reporte lanzado exitosamente");

            } catch (Exception ex) {
                System.out.println(JsfAyuda.getPropertyValue("reporteError",request.getLocale()) + ex.getMessage());
                ex.printStackTrace();
                throw new ServletException(JsfAyuda.getPropertyValue("reporteError",request.getLocale())+ " - "+ex.getMessage(), ex);
            }


        } finally {
            if (out != null) 
                out.close();
            try{
            if(conexion!=null && !conexion.isClosed())
                conexion.close();
            }catch(Exception e){
                e.printStackTrace();
            }
            /*
            controlDatos = null;
            procesaDatos = null;
            datoReporte =null;
            reporteJasper = null;
            jasperPrint = null;
            */
        }
    }

    /**
     * Genera la conexion a la base de datos segun los parametros configurados al reporte
     * @param ProcesaDatosReporte donde se obtienen los parametros permanentes configurados al reporte
     * @return Connection a la base de datos
     */


    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Sevlet para generacion de reportes";
    }// </editor-fold>
}
